package realtime.ods;

import org.apache.flink.table.api.{Table, TableResult}
import BaseConfig._

/**
 * ODS层：操作数据存储层，负责原始数据接入与格式标准化
 * 工单编号：大数据-用户画像-11-达摩盘基础特征
 */
object OdsLayer {
        /**
         * 读取用户行为日志表，解析时间戳字段
         * 数据来源：淘宝平台用户行为日志（浏览/搜索/收藏/加购/下单/支付/评价）{insert\_element\_0\_}
         */
        def readUserBehavior(tEnv: StreamTableEnvironment): Table = {
        tEnv.sqlQuery(
        s"""
         |SELECT
         |  user_id,          -- 用户ID
         |  behavior_type,    -- 行为类型：view/search/collect/cart/buy/pay/comment
         |  item_id,          -- 商品ID
         |  category_id,      -- 商品类目ID
         |  brand_id,         -- 品牌ID
         |  price,            -- 商品价格
         |  search_keyword,   -- 搜索词（若行为类型为search）
         |  action_time,      -- 行为时间（原始字符串）
         |  TO_TIMESTAMP(action_time, 'yyyy-MM-dd HH:mm:ss') AS action_ts, -- 标准化时间戳
         |  device_type       -- 设备类型：ios/android/pc
         |FROM ${ODS_USER_BEHAVIOR}
         |WHERE action_time IS NOT NULL -- 过滤无效时间数据
       """.stripMargin)
        }

        /**
         * 读取用户资料表，提取生日、主动填写的身高体重
         * 数据来源：用户淘宝/天猫个人资料（生日字段用于星座计算，身高体重用于基础特征）{insert\_element\_1\_}
         */
        def readUserProfile(tEnv: StreamTableEnvironment): Table = {
        tEnv.sqlQuery(
        s"""
         |SELECT
         |  user_id,
         |  birthday,         -- 生日：格式'yyyy-MM-dd'（如未填写则为NULL）
         |  height_self,      -- 主动填写身高（cm，如未填写则为NULL）
         |  weight_self,      -- 主动填写体重（如未填写则为NULL，可能含单位：kg/斤）
         |  register_time     -- 注册时间（用于过滤无效用户）
         |FROM ${ODS_USER_PROFILE}
       """.stripMargin)
        }

        /**
         * 读取订单表，提取商品类目、评价体重数据
         * 数据来源：用户购买体重秤/健康类商品时的评价、售后反馈{insert\_element\_2\_}
         */
        def readOrderInfo(tEnv: StreamTableEnvironment): Table = {
        tEnv.sqlQuery(
        s"""
         |SELECT
         |  user_id,
         |  order_id,
         |  item_id,
         |  category_id,      -- 商品一级类目ID（用于性别标签品类判断）{insert\_element\_3\_}
         |  pay_amount,       -- 支付金额（用于价格敏感度计算）
         |  comment_weight,   -- 评价中填写的体重（如'65kg'/'130斤'）
         |  pay_time          -- 支付时间（用于近30天行为筛选）
         |FROM ${ODS_ORDER_INFO}
         |WHERE pay_time IS NOT NULL -- 过滤未支付订单
       """.stripMargin)
        }

        /**
         * 读取设备数据表，提取智能设备同步的身高体重、系统版本
         * 数据来源：接入淘宝生态的智能体脂秤设备（需用户授权）{insert\_element\_4\_}
         */
        def readDeviceData(tEnv: StreamTableEnvironment): Table = {
        tEnv.sqlQuery(
        s"""
         |SELECT
         |  user_id,
         |  device_id,
         |  device_type,      -- 设备类型：ios/android/pc
         |  device_version,   -- 系统版本（是否为最新版）
         |  sync_height,      -- 设备同步身高（cm，精确值）
         |  sync_weight,      -- 设备同步体重（kg，精确值）
         |  sync_time         -- 同步时间（用于实时更新标签）
         |FROM ${ODS_DEVICE_DATA}
         |WHERE sync_time >= DATE_SUB(CURRENT_DATE(), 30) -- 只保留近30天设备数据
       """.stripMargin)
        }

        // 将ODS层表注册为临时视图，供DWD层调用
        def registerOdsTables(tEnv: StreamTableEnvironment): Unit = {
        tEnv.createTemporaryView("dwd_user_behavior_raw", readUserBehavior(tEnv))
        tEnv.createTemporaryView("dwd_user_profile_raw", readUserProfile(tEnv))
        tEnv.createTemporaryView("dwd_order_info_raw", readOrderInfo(tEnv))
        tEnv.createTemporaryView("dwd_device_data_raw", readDeviceData(tEnv))
        }
        }